package top.v5it.japi.ddd.core.dao.impl.wrapper;

/**
 * 工厂类，用于创建不同类型的 Wrapper 对象
 *
 * @author zhanpu
 * @date 2023/5/12
 */
public abstract class WrapperFactory {

    private WrapperFactory() {
        throw new UnsupportedOperationException();
    }

    /**
     * 创建 ColumnWrapper 对象
     *
     * @param entity 实体对象
     * @param <T>    实体类型
     * @param <W>    子类类型
     * @return ColumnWrapper 对象
     */
    public static <T, W extends ColumnWrapper<T, W>> ColumnWrapper<T, W> createColumnWrapper(T entity) {
        return new ColumnWrapper<>(entity);
    }

    /**
     * 创建 StatisticsWrapper 对象
     *
     * @param entity 实体对象
     * @param <T>    实体类型
     * @param <W>    子类类型
     * @return StatisticsWrapper 对象
     */
    public static <T, W extends StatisticsWrapper<T, W>> StatisticsWrapper<T, W> createStatisticsWrapper(T entity) {
        return new StatisticsWrapper<>(entity);
    }

    /**
     * 创建 QueryConditionWrapper 对象
     *
     * @param entity 实体对象
     * @param <T>    实体类型
     * @param <W>    子类类型
     * @return QueryConditionWrapper 对象
     */
    public static <T, W extends QueryConditionWrapper<T, W>> QueryConditionWrapper<T, W> createQueryConditionWrapper(T entity) {
        return new QueryConditionWrapper<>(entity);
    }

    /**
     * 创建 SqlWrapper 对象
     *
     * @param entity 实体对象
     * @param <T>    实体类型
     * @param <W>    子类类型
     * @return SqlWrapper 对象
     */
    public static <T, W extends SqlWrapper<T, W>> SqlWrapper<T, W> createSqlWrapper(T entity) {
        return new SqlWrapper<>(entity);
    }

}
